<?php
class ManageProductsController extends AppController {
	var $name = 'ManageProducts';
	var $uses = array('products.ProductCategory', 'products.Product', 'access_logs.AccessLog');
	/**
	 @var $helpers
	 @brief Danh sách tất cả các Helper được sử dụng trong view
	 */
	var $helpers = array('Form','Wysiwyg');
	
	/**
	 @var $components
	 @brief Danh sách tất cả các Component được sử dụng trong controller
	 */
	var $components = array('MultiFileUpload', 'RootHandler');
	/**
	 @var $model
	 @brief Thông tin về model, được sử dụng trong trường hợp override thông tin của danh mục
	 */
	var $models = array(
		'Category'	=>	array(
			'plugin'	=>	'products',
			'name'		=>	'ProductCategory'
		),
		'Page'	=>	array(
			'plugin'	=>	'products',
			'name'		=>	'Product'
		)
	);
	function beforeFilter() {
		parent::beforeFilter();
		
		$this->configs = $this->Product->loadConfig();
		
		$this->AccessLog->currentUser = $this->user;
		
		$this->RootHandler->startup($this);
		
		$this->RootHandler->chRoot('products.root_id', array('categoryName' => 'ProductCategory'));
		
		if (!isset($this->params['named']['root']) || empty($this->params['named']['root'])) {
			$firstCat = $this->ProductCategory->find('first', array(
				'contain'	=>	array(),
				'conditions'	=> array(
					'parent_id'	=> $this->configs['Category']['root_id']
				)
			));
			
			$this->category_root_id = $firstCat['ProductCategory']['id'];
			$this->params['named']['root'] = $firstCat['ProductCategory']['alias'];
		}
		$this->set('configs', $this->configs);
		
	}
	//TODO: Phần thay đổi
	/**
	 * Hành động liệt kê ra danh sách các trang, có phân trang
	 */
	function index() {
		if ($this->category_root_id) {
			$category = $this->ProductCategory->find('first', array(
				'contain'	=> array(),
				'conditions' => array(
					'ProductCategory.id'	=> $this->category_root_id
				)
			));
		}
		$this->set('category', $category);
		
		$pages = $this->Product->getList(
			$this, 
			array('Product.created', 'Product.special','Product.is_published', 'Product.priority'), 
			array('limit' => 20)
		);
		$this->set('pages', $pages);
	}
	/**
	 * Phương thức được sử dụng để tạo mới một trang, bao gồm hiển thị form nhập liệu và xử lý các thông tin nhập liệu đó
	 */
	function add() {
		if (empty($this->data)) {
			// load dữ liệu trong trường hợp phát sinh lỗi
			$this->__checkError($this->models['Page']['name']);
			
			
			$nodes = $this->{$this->models['Category']['name']}->children($this->category_root_id, false, array('id','name','lft','rght','parent_id'));
			$tree = $this->{$this->models['Category']['name']}->transformToTree($nodes);
			$this->set('categories', $tree);
			$this->set('category_root_id', $this->category_root_id);
			
		} else {
			try {
				//debug($this->data);exit;
				// Create Category Information
				$this->data = $this->Product->validateData($this->data);
			} catch (Exception $ex) {
				$this->__setError($this->models['Page']['name']);
				$this->Session->setFlash($ex->getMessage(), "flash_error" );
				$this->redirect("/".$this->params['url']['url']);
			}
			// Xử lý với image
			$image = "";
			//debug($this->data);exit;
			if (isset($this->configs[$this->models['Page']['name']]['image']['show']) && $this->configs[$this->models['Page']['name']]['image']['show']) {
				$this->MultiFileUpload->encode_filename = false;
				$this->MultiFileUpload->uploadpath = $this->configs[$this->models['Page']['name']]['image']['path'];
				if (isset($this->configs[$this->models['Page']['name']]['upload']) && isset($this->configs[$this->models['Page']['name']]['upload']['AttachTypeAllowed'])) {
					$this->MultiFileUpload->_properties['AttachTypeAllowed'] = $this->configs[$this->models['Page']['name']]['upload']['AttachTypeAllowed'];
				}
				
				$imgRet = array();
				try {
					$imgRet = $this->MultiFileUpload->upload();
				} catch (Exception $ex) {
					$this->Session->setFlash($ex->getMessage(), "flash_error" );
					//$this->redirect(array(
//						'action'	=> 'index',
//						'root'		=>	$this->params['named']['root']
//					));
					$this->redirect("/".$this->params['url']['url']);
				}

				if (count($imgRet) && isset($imgRet['image']['image'])) {
					//debug($imgRet);exit;
					// assign name to image field.
					$this->data[$this->models['Page']['name']]['image'] = $imgRet['image']['image'];
					
					App::import('Vendor','images/my_image'); 
					$thumbnail_dir = $this->configs[$this->models['Page']['name']]['thumbnail']['path'];
					
					// Nếu chế độ là tự động resize, tiến hành resize
					$my_image = new my_image($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
					if (isset($this->configs[$this->models['Page']['name']]['image']['autoResize']) && $this->configs[$this->models['Page']['name']]['image']['autoResize']) {
						// resize image
						$my_image->thumbnail(
							$this->configs[$this->models['Page']['name']]['image']['width'],
							$this->configs[$this->models['Page']['name']]['image']['height'],
							$this->configs[$this->models['Page']['name']]['image']['percent']
						);
						$my_image->copyTo($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
					}
					
					
					if (!is_dir($thumbnail_dir)) {
						mkdir($thumbnail_dir);
					}
					// create thumbnail
					$my_image->thumbnail(
						$this->configs[$this->models['Page']['name']]['thumbnail']['width'],
						$this->configs[$this->models['Page']['name']]['thumbnail']['height'],
						$this->configs[$this->models['Page']['name']]['thumbnail']['percent']
					);
					
					$ext = strrchr($imgRet['image']['image'], ".");
					$pos = strrpos($imgRet['image']['image'], ".");
					$filename = substr($imgRet['image']['image'],0,$pos);
					$thumbnail_name = $filename."_thumbnail".$ext;
					$my_image->copyTo($thumbnail_dir.$thumbnail_name);

					$image = $imgRet['image']['image'];
				}
			}
			
			$this->Product->create($this->data);
			if ($this->Product->save($this->data)) {
				$this->Session->setFlash(__("Sản phẩm đã được tạo thành công!", true) , "flash_success");
				$this->redirect(array(
					'action'	=> 'index',
					'root'		=>	$this->params['named']['root']
				));
			} else {
				if (isset($this->configs[$this->models['Page']['name']]['image']['show']) && $this->configs[$this->models['Page']['name']]['image']['show']) {
					// Delete uploaded image
					$this->Product->delete_image($image, $this->configs);
				}
				$this->__setError($this->models['Page']['name']);
				$this->Session->setFlash(__("Không thể lưu sản phẩm. Vui lòng thử lại", true), "flash_error");
				
				$this->redirect("/".$this->params['url']['url']);
			}
		}
	}
	
	/**
	 * Phương thức được sử dụng để chỉnh sửa thông tin một trang, bao gồm hiển thị form nhập liệu và xử lý các thông tin nhập liệu đó
	 * @param $id ID của trang cần chỉnh sửa
	 */
	function edit($id=null) {
		if (empty($this->data)) {
			$this->data = $this->Product->read(null, $id);
			// load dữ liệu trong trường hợp phát sinh lỗi
			$this->__checkError($this->models['Page']['name']);
			$nodes = $this->{$this->models['Category']['name']}->children($this->category_root_id, false);
			$tree = $this->{$this->models['Category']['name']}->transformToTree($nodes);
			$this->set('categories', $tree);

			$this->set('category_root_id', $this->category_root_id);
			
		} else {
			try {
				// Create Category Information
				$this->data = $this->Product->validateData($this->data);
			} catch (Exception $ex) {
				$this->__setError($this->models['Page']['name']);
				$this->Session->setFlash($ex->getMessage(), "flash_error" );
				$this->redirect("/".$this->params['url']['url']);
			}
			
			// Xử lý với image
			$image = "";
			if (isset($this->configs[$this->models['Page']['name']]['image']['show']) && $this->configs[$this->models['Page']['name']]['image']['show']) {
				$oldImage = "";
				$this->MultiFileUpload->encode_filename = false;
				$this->MultiFileUpload->uploadpath = $this->configs[$this->models['Page']['name']]['image']['path'];
				if (isset($this->configs[$this->models['Page']['name']]['upload']) && isset($this->configs[$this->models['Page']['name']]['upload']['AttachTypeAllowed'])) {
					$this->MultiFileUpload->_properties['AttachTypeAllowed'] = $this->configs[$this->models['Page']['name']]['upload']['AttachTypeAllowed'];
				}
				
				$imgRet = array();
				try {
					$imgRet = $this->MultiFileUpload->upload();
				} catch (Exception $ex) {
					$this->Session->setFlash($ex->getMessage(), "flash_error" );
					//$this->redirect(array(
//						'action' => 'index',
//						'root'		=>	$this->params['named']['root']
//					));
					$this->redirect("/".$this->params['url']['url']);
				}
				
				if (count($imgRet) && isset($imgRet['image']['image'])) {
					// assign name to image field.
					$this->data[$this->models['Page']['name']]['image'] = $imgRet['image']['image'];
					App::import('Vendor','images/my_image'); 
					$thumbnail_dir = $this->configs[$this->models['Page']['name']]['thumbnail']['path'];
					$my_image = new my_image($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
					if (isset($this->configs[$this->models['Page']['name']]['image']['autoResize']) && $this->configs[$this->models['Page']['name']]['image']['autoResize']) {
						
						// resize image
						$my_image->thumbnail(
							$this->configs[$this->models['Page']['name']]['image']['width'],
							$this->configs[$this->models['Page']['name']]['image']['height'],
							$this->configs[$this->models['Page']['name']]['image']['percent']
						);
						$my_image->copyTo($this->MultiFileUpload->uploadpath.$imgRet['image']['image']);
					}
					
					if (!is_dir($thumbnail_dir)) {
						mkdir($thumbnail_dir);
					}
					// create thumbnail
					$my_image->thumbnail(
						$this->configs[$this->models['Page']['name']]['thumbnail']['width'],
						$this->configs[$this->models['Page']['name']]['thumbnail']['height'],
						$this->configs[$this->models['Page']['name']]['thumbnail']['percent']
					);
					
					$ext = strrchr($imgRet['image']['image'], ".");
					$pos = strrpos($imgRet['image']['image'], ".");
					$filename = substr($imgRet['image']['image'],0,$pos);
					$thumbnail_name = $filename."_thumbnail".$ext;
					$my_image->copyTo($thumbnail_dir.$thumbnail_name);
					
					$image = $imgRet['image']['image'];
					
					// Get Old Image
					$oldImage = $this->Product->field('image');
				}
				
			}
			
			if ($this->Product->save($this->data)) {
//				if (isset($this->configs[$this->models['Page']['name']]['image']['show']) && $this->configs[$this->models['Page']['name']]['image']['show']) {
//					// delete old image
//					$this->Product->delete_image($oldImage, $this->configs);
//				}
				$this->Session->setFlash(__("Sản phẩm đã được cập nhật thành công!", true), "flash_success");
				//debug($this->params['named']['root']); exit;
				$this->redirect(array(
					'action'	=> 'edit',
					$id,
					'root'		=>	$this->params['named']['root']
				));
			} else {
				if (isset($this->configs[$this->models['Page']['name']]['image']['show']) && $this->configs[$this->models['Page']['name']]['image']['show']) {
					// Delete uploaded image
					$this->Product->delete_image($image, $this->configs);
				}
				$this->__setError($this->models['Page']['name']);
				$this->Session->setFlash(__("Không thể lưu sản phẩm. Bạn vui lòng thử lại", true), "flash_error");

				// Redirect to current page for refreshing
				$this->redirect("/".$this->params['url']['url']);
			}
		}
	}
	
	/**
	 * Hành động delete được sử dụng để xóa 1 trang, bao gồm thông tin dữ liệu của trang và các thông tin liên quan như hình ảnh, dữ liệu liên quan, ...
	 * @param $id ID của trang cần xóa
	 */
	function delete($id) {
		// Delete Image First
		try {
			$this->Product->deletePage($id);
			$this->Session->setFlash(__("Sản phẩm đã được xóa thành công!", true), "flash_success");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		} catch (Exception $ex) {
			$this->Session->setFlash(__("Không thể xóa sản phẩm. Bạn vui lòng thử lại", true), "flash_error");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		}
	}

	/**
	 * Phương thức được sử dụng để xóa hình ảnh của trang, bao gồm cả xóa thông tin dữ liệu và hình ảnh trên ổ cứng (kể cả thumbnail nếu có)
	 * @return unknown_type
	 */
	function delete_image() {
		if (isset($this->params['named']['page_id'])) {
			$id = intval($this->params['named']['page_id']);
			
			// Delete image in database
			$oldImage = $this->Product->deleteImage($id);
			
			// Delete image in hard-disk
			$this->Product->delete_image($oldImage, $this->configs);
			
			// redirect
			$this->Session->setFlash(__("Hình ảnh đã được xóa thành công!", true), "flash_success");
			$this->redirect(array(
				'action'=>'edit', 
				$id,
				'root'		=>	$this->params['named']['root']
			));
		} else {
			$this->Session->setFlash(__('Sai mã trang', true), "flash_error");
			$this->redirect(array(
				'action'=>'index',
				'root'		=>	$this->params['named']['root']
			));
		}
	}
	/**
	 * Phương thức được sử dụng để cập nhật lại thứ tự các trang (Mặc định của hệ thống là sắp xếp từ cao xuống thấp)
	 */
	function update_priority() {
		if (isset($_POST) && !empty($_POST)) {
			$this->data = array();
			foreach ($_POST['priority'] as $id => $item) {
				$this->data[][$this->models['Page']['name']] = array(
					'id'		=>	$id,
					'priority'	=>	$item
				);
			}
			//debug($_SERVER);exit;
			//debug($this->data);exit;
			$this->Product->Behaviors->detach('Sluggable');
			$this->Product->saveAll($this->data);
			$this->Session->setFlash(__("Độ ưu tiên đã được cập nhật!", true), "flash_success");
			if (isset($_SERVER['HTTP_REFERER'])) {
				$this->redirect($_SERVER['HTTP_REFERER']);
				//header("Location: ".$_SERVER['HTTP_REFERER']);
			} else {
				$this->redirect(array('action' => 'index'));
			}
		}
	}
	
	function mass_delete() {
		$checkboxes = array();
		if (isset($_POST['checkbox_index'])) {
			$checkboxes = $_POST['checkbox_index'];
		}
		if (count($checkboxes) > 0) {
			foreach ($checkboxes as $id) {
				$this->Product->deletePage($id);
			}
			
			$this->Session->setFlash(__("Sản phẩm đã được xóa thành công!", true), "flash_success");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		} else {
			$this->Session->setFlash(__("Bạn vui lòng chọn các sản phẩm cần xóa", true), "flash_error");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		}
	}
	
	function publish() {
		$checkboxes = array();
		if (isset($_POST['checkbox_index'])) {
			$checkboxes = $_POST['checkbox_index'];
		}
		if (count($checkboxes) > 0) {
			foreach ($checkboxes as $id) {
				$this->Product->updateAll(
					// fields
					array('is_published'	=> 1),
					
					// conditions
					array('Product.id'	=> $checkboxes)
				);
			}
			
			$this->Session->setFlash(__("Các sản phẩm đã được kích hoạt!", true), "flash_success");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		} else {
			$this->Session->setFlash(__("Bạn vui lòng chọn các sản phẩm cần kích hoạt", true), "flash_error");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		}
	}
	function unpublish() {
		$checkboxes = array();
		if (isset($_POST['checkbox_index'])) {
			$checkboxes = $_POST['checkbox_index'];
		}
		if (count($checkboxes) > 0) {
			foreach ($checkboxes as $id) {
				$this->Product->updateAll(
					// fields
					array('is_published'	=> 0),
					
					// conditions
					array('Product.id'	=> $checkboxes)
				);
			}
			
			$this->Session->setFlash(__("Các sản phẩm đã được hủy kích hoạt!", true), "flash_success");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		} else {
			$this->Session->setFlash(__("Bạn vui lòng chọn các sản phẩm cần hủy kích hoạt", true), "flash_error");
			$this->redirect(array(
				'action'	=>	'index',
				'root'		=>	$this->params['named']['root']
			));
		}
	}
}
?>